package com.niit.scala

object Base_04 {

  //1.创建一个空类 类名叫做Person
  //如果类是空的可以省略 {}
  class Person

  class Student{

    var name = "张三"
    // _作为初始变量的占位符，必须使用var进行声明，并且必须指定数据类型
    var age:Int = _

    def printInfo()=println(s"姓名：${name},年龄：${age}")

  }

  /*
  构造器
     主构造器：
        格式 class 类型(参数列表)
         有参构造器 无参构造器可以把括号省略掉。有参构造器会取代无参构造器
     辅助构造器:
        方法名比较叫this。格式 def this(参数列表)
   */
  class Dog(var name:String,var age:Int){
    //辅助构造器可以拥有多个
    def this(){
      this("",0)
    }

    def this(arr:Array[String]){
      //第一行必须调用主构造器
      this("李四",12)
      println("辅助构造器："+ arr(0),arr(1))
    }
  }

  /*
  静态:Scala是没有static关键字，如果想使用静态只能定义单例对象
    调用：对象名.属性
   */
  object Cat{
    val leg_num = 4
    var name = "小白"

    def jiao(): Unit ={
      println("miaomiao~~")
    }
  }

  /*
   伴生
    在Java中，类里面可以定义成员变量和成员方法以及静态变量和静态方法。如果想在Scala中实现这一个效果就要用到 伴生对象
     一个claa和一个object的名字是相同，那么就叫做伴生。object为伴生对象，class为伴生类
     并且这个class和object必须在同一个文件当中
     伴生对象和伴生类可以相互访问private属性
   */
  class Generals{
    private val name ="Tom"

     def printInfo(): Unit ={
      println("xxxx:"+Generals.age)
      Generals.printMsg()
    }
  }
  /*
      ↑↑↑↑↑↑↑
      互为伴生
      ↓↓↓↓↓↓↓
   */
  object Generals{
    var g = new Generals
    val age = 18

    private def printMsg(): Unit ={
      println(g.name)
    }


  }

  class Animal(var name:String)
  object Animal{
    //apply可以免去实例化的操作
    def apply(name: String): Animal = new Animal(name)
  }



  def main(args: Array[String]): Unit = {
    //实例化 将 类 变成 对象 关键字为new
    //如果构造器是空的，在实例化的时候可以省略()
    val p = new Person
    var stu = new Student
    stu.name= "李四"
    stu.age = 18
    stu.printInfo()

    var dog = new Dog("旺财",2)
    println(dog.name,dog.age)
    var dog2 = new Dog(Array("二狗","广西"))
    var dog3 = new Dog

    println(Cat.leg_num,Cat.name)
    Cat.jiao()

    var gg = new Generals
    gg.printInfo()

   var ami = Animal("二狗")

  }
}
